home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
Blogowanie poza sfera
/
Flock 1.0 beta
/
flock-1.0RC3.en-US.win32.exe
/
flock
/
components
/
flockXangaService.js
< prev
next >
Wrap
Text File
|
2007-10-18
|
19KB
|
567 lines
// vim: ts=2 sw=2 expandtab cindent
//
// BEGIN FLOCK GPL
//
// Copyright Flock Inc. 2005-2007
// http://flock.com
//
// This file may be used under the terms of of the
// GNU General Public License Version 2 or later (the "GPL"),
// http://www.gnu.org/licenses/gpl.html
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
//
// END FLOCK GPL
const ENABLE_DEBUG = true; // switch to turn off slow debug code for production
function DEBUG(x) { if (ENABLE_DEBUG) debug("flockXangaService: "+x+"\n"); }
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const XANGA_CID = Components.ID("{4a67cc66-aafa-4df6-a836-c63bc92651e7}");
const XANGA_CONTRACTID = "@flock.com/people/xanga;1";
const XANGA_FAVICON = "http://www.xanga.com/favicon.ico";
const SERVICE_ENABLED_PREF = "flock.service.xanga.enabled";
const CATEGORY_COMPONENT_NAME = "Xanga JS Component"
const CATEGORY_ENTRY_NAME = "xanga"
const RDFS = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
// ====================================================
// ========== BEGIN General helper functions ==========
// ====================================================
var gCompTK;
function getCompTK() {
if (!gCompTK) {
gCompTK = Components.classes["@flock.com/singleton;1"]
.getService(Components.interfaces.flockISingleton)
.getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
.wrappedJSObject;
}
return gCompTK;
}
function loadSubScript(spec) {
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
var context = {};
loader.loadSubScript(spec, context);
return context;
}
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader);
loader.loadSubScript("chrome://browser/content/utilityOverlay.js");
// ================================================
// ========== BEGIN flockXGService class ==========
// ================================================
function flockXGService()
{
var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
obs.addObserver(this, "xpcom-shutdown", false);
this.status = Ci.flockIWebService.STATUS_UNKNOWN;
this.url = "http://www.xanga.com";
this.mIsInitialized = false;
this._ctk = {
interfaces: [
"nsISupports",
"nsIClassInfo",
"nsISupportsCString",
"nsIObserver",
"flockIWebService",
"flockIManageableWebService",
"flockIBlogWebService"
],
shortName: "xanga",
fullName: "Xanga",
description: "Flock Xanga Service",
favicon: XANGA_FAVICON,
CID: XANGA_CID,
contractID: XANGA_CONTRACTID,
accountClass: flockXGAccount
};
this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
this.init();
}
// BEGIN nsIObserver
flockXGService.prototype.observe =
function flockXGService_observe(subject, topic, state)
{
switch (topic) {
case "xpcom-shutdown":
var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
obs.removeObserver(this, "xpcom-shutdown");
return;
}
}
// END nsIObserver
// BEGIN flockIWebService
flockXGService.prototype.addAccountById =
function flockXGService_addAccountById(aUsername, aIsTransient, aListener)
{
this.logger.info("addAccountById('"+aUsername+"')");
var accountURN = this.acUtils.createAccount(this, aUsername);
var c_account = this.faves_coop.get(accountURN);
c_account.isTransient = aIsTransient;
c_account.service = this.xgService;
this.USER = accountURN;
// add blog
var c_blog = new this.faves_coop.Blog(accountURN+":uniqueblog", {
name: aUsername,
title: aUsername,
blogid: aUsername,
apiLink: "",
URL: "http://www.xanga.com/private/yourhome.aspx?user="+aUsername,
});
c_account.children.addOnce(c_blog);
var acct = this.getAccount(accountURN);
if (aListener) aListener.onSuccess(acct, "addAccount");
return acct;
}
flockXGService.prototype.init =
function flockXGService_init()
{
DEBUG(".init()");
// Prevent re-entry
if (this.mIsInitialized) return;
this.mIsInitialized = true;
var evtID = this._profiler.profileEventStart("xanga-init");
this.prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
!this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
{
DEBUG("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
return;
}
// Logger
this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
this.logger.init("xanga");
// Attributes of flockIBlogWebService
this.supportsCategories = 0;
this.supportsPostReplace = false;
this.metadataOverlay = "chrome://flock/content/blog/xangaOverlay.xul";
this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
this.faves_coop = Cc["@flock.com/singleton;1"]
.getService(Ci.flockISingleton)
.getSingleton("chrome://flock/content/common/load-faves-coop.js")
.wrappedJSObject;
this.account_root = this.faves_coop.accounts_root;
this.xgService = new this.faves_coop.Service('urn:xanga:service');
this.xgService.name = 'xanga';
this.xgService.desc = 'The Xanga.com Service';
this.xgService.domains = "xanga.com";
this.xgService.serviceId = XANGA_CONTRACTID;
var xgHomepage = new this.faves_coop.Favorite('urn:xanga:actions:homepage');
xgHomepage.name = 'Xanga.com';
xgHomepage.URL = 'http://www.xanga.com';
this.xgService.children.addOnce(xgHomepage);
this.urn = this.xgService.id();
this.webDetective = this.acUtils.useWebDetective("xanga.xml");
this._profiler.profileEventEnd(evtID, "");
}
flockXGService.prototype.refresh =
function flockXGService_refresh(aURN, aListener)
{
debug("flockXGService refresh with aURN of "+aURN+"\n");
// Introspection against what we're syncing - Identity or Account or Item?
var refreshItem = this.faves_coop.get(aURN);
if (refreshItem instanceof this.faves_coop.Account) {
}
else if (refreshItem instanceof this.faves_coop.Favorite) {
}
else {
throw Components.results.NS_ERROR_ABORT;
}
}
flockXGService.prototype.refreshAccount =
function flockXGService_refreshAccount(aURN, aListener)
{
debug("XGService - refreshAccount with aURN of "+aURN);
}
// BEGIN flockIBlogWebService interface
flockXGService.prototype.newPost = function(aListener, aBlogId, aPost, aPublish, aNotifications) {
dump("==== newPost in Xanga\n");
/* var authenticated = false;
var enum = this.faves_coop.accounts_root.children.enumerate();
while (enum.hasMoreElements()) {
var account = enum.getNext();
if (!account) continue; // getNext() can return NULL when hasMoreElements() is TRUE.
if ((account.serviceId == XANGA_CONTRACTID) && (account.isAuthenticated))
authenticated = true;
}
if (!authenticated) {
var error = Components.classes['@flock.com/error;1']
.createInstance(Components.interfaces.flockIError);
error.errorCode = error.BLOG_LOGIN_REQUIRED;
aListener.onError(error);
return;
}*/
var notifsArray = new Array();
// var html = aPost.description + addTechnoratiTags(aPost.tags);
while (aNotifications.hasMore())
notifsArray.push(aNotifications.getNext());
//var comments = aPost.extra.getNext();
//var privacy = aPost.extra.getNext();
//var mood = aPost.extra.getNext().split('||');
var textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"].getService(Components.interfaces.nsITextToSubURI);
var tags = "";
while (aPost.tags.hasMore())
tags += (aPost.tags.getNext() + '%2C');
var privacy = aPost.extra.getNext();
var comments = aPost.extra.getNext();
function postForReal(aToken) {
var postMessage = '__EVENTTARGET='+
'&__EVENTARGUMENT='+
'&__VIEWSTATE=' + aToken +
'&txtTitle=' + textToSubURI.ConvertAndEscape("UTF-8", aPost.title) +
'&spellcheckbtn=false' +
'&RadEContentTextareawerichtext=' +
'&werichtext=++++++++++++++++++++++++++++++++++++++++++++++++' +
'&tnames=' +
'&ptag=tagname' +
'&proftitle0=' +
'&proftitle1=' +
'&proftitle3=' +
'&xztitle1=' +
'&xztitle2=' +
'&xzasin1=' +
'&xzformat=' +
'&xzextravalue=' +
'&weprivacy=' + privacy
'&txtRating=';
if (comments == "on")
postMessage += '&chkComments=on';
postMessage += '&btnSave=Save+Changes' +
'&epropcurrstate=0' +
'&commentcnt=0' +
'&weuniqueid=0' +
'&webgcolor=' +
'&webdcolor=' +
'&tprefid=29385413' +
'&tpref2=' +
'&tpref3=' +
'&tpref4=' +
'&tpref5=' +
'&cncel=' +
'&postvalues=' +
'&photovalues=' +
'&videovalues=' +
'&audiovalues=' +
'&bodyvalue=' + textToSubURI.ConvertAndEscape("UTF-8", aPost.description.replace(/\n/g, "<br/>")) +
'&mediaargs=' +
'&tagsoriginal=' +
'&tagstodelete=%2C' +
'&tagstoadd=%2C' + tags;
var xhr2 = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance (Ci.nsIXMLHttpRequest);
xhr2.open ('POST', 'http://www.xanga.com/private/editorx.aspx', true);
xhr2.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
xhr2.setRequestHeader ('Content-Length', postMessage.length );
xhr2.setRequestHeader ('Referer', 'http://www.xanga.com/private/editorx.aspx');
xhr2.onreadystatechange = function (aEvent) {
debug("readyState: "+xhr2.readyState);
if (xhr2.readyState == 4) {
debug("status: "+xhr2.status);
if ((xhr2.status != 200) && (xhr2.status != 302)) {
aListener.onError (xhr2.statusText);
return;
}
debug(xhr2.responseText);
aListener.onResult("");
}
}
dump(" *** Post FOR REAL!!...\n");
//dump(postMessage);
xhr2.send(postMessage);
}
function getViewState() {
// Show the editor to get the "viewState" token
var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
xhr.open('GET', 'http://www.xanga.com/private/editorx.aspx', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function (aEvent) {
if (xhr.readyState == 4) {
if (xhr.status != 200) {
aListener.onError (xhr.statusText);
return;
}
//dump(xhr.responseText);
if (xhr.responseText.match("PLEASE SIGN IN")) {
var error = Components.classes['@flock.com/error;1']
.createInstance(Ci.flockIError);
error.errorCode = error.BLOG_LOGIN_REQUIRED;
aListener.onError(error);
return;
}
// Get the token and post for real
var theHash = xhr.responseText.match(/(?:id\=\"\__VIEWSTATE\"\svalue\=\")(.+)(?=\")/);
debug("theHash: "+theHash+"\n");
debug("theHash[1]: "+theHash[1]+"\n");
if (theHash != null){
var token = theHash[1];
debug("*****\n*****\n TOKEN: "+token+"\n");
postForReal(token);
}
}
}
xhr.send(null);
}
getViewState();
}
flockXGService.prototype.editPost = function(aListener, aBlogId, aPost, aPublish, atomid, editURI, aNotifications){
}
flockXGService.prototype.deletePost = function(aListener, aBlogId, aPostid){
}
flockXGService.prototype.getUsersBlogs = function(aListener, aAccount){
}
flockXGService.prototype.getRecentPosts = function(aListener, aBlogId, aNumber){
}
flockXGService.prototype.getCategoryList = function(aListener, aBlogId){
}
// END flockIBlogWebService interface
// BEGIN flockIManageableWebService interface
flockXGService.prototype.getAccountIDFromDocument =
function flockXGService_getAccountIDFromDocument(aDocument)
{
this.logger.debug("{flockIManageableWebService}.getAccountIDFromDocument(aDocument)");
aDocument.QueryInterface(Ci.nsIDOMHTMLDocument);
var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
dump("Let's find what Xanga user it is\n");
if (this.webDetective.detect("xanga", "accountinfo", aDocument, results)) {
var accountID = results.getPropertyAsAString("accountid");
dump(accountID+" it is!\n");
if (accountID && accountID.length) {
return accountID;
}
}
else {
dump("I don't know :(\n");
}
return null;
/* var title = aDocument.title;
debug(title);
if (title.match(/(.+)\'s\sXanga\sSite/)) {
var val = RegExp.$1;
this.logger.debug(" - found account ID: "+val);
return val;
} else
debug("Xanga: unable to find the username from the page.\n");
return null;*/
}
flockXGService.prototype.updateAccountStatusFromDocument =
function flockXGService_updateAccountStatusFromDocument(aDocument)
{
this.logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument(aDocument)");
if (this.webDetective.detect("xanga", "loggedin", aDocument, null)) {
debug("WOOT WOOT Xanga user logged IN!\n");
var accountID = this.getAccountIDFromDocument(aDocument);
var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
var avatarURL;
var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
if(this.webDetective.detect("xanga", "avatarURLDetect", aDocument, results)) {
try {
avatarURL = results.getPropertyAsAString("avatarURL");
} catch(e) {
// No avatar found
}
}
var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
var acct = this.faves_coop.get(acctURN);
acct.avatar = avatarURL;
var accounts = this.faves_coop.Account.find({serviceId: XANGA_CONTRACTID});
for (var i = 0; i < accounts.length; i++) {
if (accounts[i].id() == acctURN) {
accounts[i].isAuthenticated = true;
} else {
accounts[i].isAuthenticated = false;
}
}
} else if (this.webDetective.detect("xanga", "loggedout", aDocument, null)) {
debug("WOOT WOOT Xanga user logged OUT!\n");
this.acUtils.markAllAccountsAsLoggedOut(XANGA_CONTRACTID);
}
}
// END flockIManageableWebService interface
// ================================================
// ========== BEGIN XPCOM Module support ==========
// ================================================
function createModule(aParams) {
return {
registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
var aCompMgr = aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
aParams.contractID, aFileSpec,
aLocation, aType );
var catMgr = Cc["@mozilla.org/categorymanager;1"]
.getService(Ci.nsICategoryManager);
if (!aParams.categories) { aParams.categories = []; }
for (var i = 0; i < aParams.categories.length; i++) {
var cat = aParams.categories[i];
catMgr.addCategoryEntry( cat.category, cat.entry,
cat.value, true, true );
}
},
getClassObject: function (aCompMgr, aCID, aIID) {
if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
return { // Factory
createInstance: function (aOuter, aIID) {
if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
var comp = new aParams.componentClass();
if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
return comp.QueryInterface(aIID);
}
};
},
canUnload: function (aCompMgr) { return true; }
};
}
// NS Module entrypoint
function NSGetModule(aCompMgr, aFileSpec) {
return createModule({
componentClass: flockXGService,
CID: XANGA_CID,
contractID: XANGA_CONTRACTID,
componentName: CATEGORY_COMPONENT_NAME,
implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
categories: [
{ category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: XANGA_CONTRACTID },
{ category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: XANGA_CONTRACTID }
]
});
}
// ========== END XPCOM Module support ==========
// ================================================
// ========== BEGIN flockXGAccount class ==========
// ================================================
function flockXGAccount()
{
this.logger = Cc["@flock.com/logger;1"].createInstance(Ci.flockILogger);
this.logger.init("xangaAccount");
this.faves_coop = Cc["@flock.com/singleton;1"]
.getService(Ci.flockISingleton)
.getSingleton("chrome://flock/content/common/load-faves-coop.js")
.wrappedJSObject;
this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
this._ctk = {
interfaces: [
"nsISupports",
"flockIWebServiceAccount",
"flockIBlogWebServiceAccount"
]
};
getCompTK().addAllInterfaces(this);
}
// BEGIN flockIWebServiceAccount
flockXGAccount.prototype.activate = function(aListener) {
}
flockXGAccount.prototype.deactivate = function(aListener) {
}
// END flockIWebServiceAccount
// flockIBlogWebServiceAccount implementation
flockXGAccount.prototype.getBlogs = function() {
this.logger.info("{flockIBlogWebServiceAccount}.getBlogs()");
var blogsEnum = {
QueryInterface : function(iid) {
if (!iid.equals(Ci.nsISupports) &&
!iid.equals(Ci.nsISimpleEnumerator))
{
throw Components.results.NS_ERROR_NO_INTERFACE;
}
return this;
},
hasMoreElements : function() {
return false;
},
getNext : function() {
}
};
return blogsEnum;
}